module.exports = app => {
  const express = require('express')
  const router = express.Router()
  const multiparty = require('multiparty')
  const fs = require('fs') // node.js核心的文件处理模块
  const path = require('path')
  app.use(express.json()) // post解析json

  // 统一格式化返回值
  function formatReq (code, msg, data) {
    return {
      code: code,
      data: data,
      msg
    }
  }

  // 上传
  router.post('/upload/:name', async (req, res) => {
    const uploadDir = './' // 这个不用改，因为并不是保存在这个目录下，这只是作为中间目录，待会要重命名文件到指定目录的
    const form = new multiparty.Form()
    form.uploadDir = uploadDir
    form.keepExtensions = true // 是否保留后缀
    form.parse(req, function (err, fields, files) { // 其中fields表示你提交的表单数据对象，files表示你提交的文件对象
      // 这里是save_path 就是前端传回来的 path 字段，这个字段会被 multiparty 中间件解析到 fields 里面 ，这里的 fields 相当于 req.body 的意思
      if (err) {
        res.send(formatReq(1, '上传失败'))
      } else {
        if (!files.file) res.send(formatReq(1, '上传失败'))
        else {
          // 所有文件重命名，（因为不重名的话是随机文件名）
          files.file.forEach(item => {
            fs.rename(item.path, item.originalFilename, function (err) {
              if (err) {
                res.send(formatReq(1, '上传失败'))
              } else {
                let filePath = path.join(__dirname, '../upload/' + item.originalFilename)
                if (item.originalFilename === 'blob' || req.params.name) {
                  filePath = path.join(__dirname, `../upload/${req.params.name}.png`)
                }
                console.log(item.originalFilename, filePath)
                fs.rename(item.originalFilename, filePath, function (err) {
                  if (err) res.send(formatReq(1, '上传失败'))
                  else res.send(formatReq(0, '上传成功', req.params.name && `staticFile/${req.params.name}.png`))
                })
              }
            })
          })
        }
      }
    })
  })

  // 下载
  router.get('/download/:name', async (req, res) => {
    try {
      const filePath = path.join(__dirname, '../upload/' + req.params.name)
      fs.readFile(filePath, 'utf8', (err, data) => {
        if (err) {
          return res.send(formatReq(1, '没有此文件'))
        }
        res.writeHead(200, {
          'Content-Disposition': 'attachment; filename=' + encodeURIComponent(req.params.name),
          'Content-Type': 'application/octet-stream'
        })
        // fs.createReadStream(filePath).pipe(res)
        res.end(data)
      })
    } catch (err) {
      res.send(formatReq(1, err))
    }
  })

  app.use('/node/api/file', router)
}
